package br.com.puc.controllers;

import java.util.List;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.puc.models.Publicacao;
import br.com.puc.models.annotations.Publico;
import br.com.puc.repositories.ColaboradorRepository;
import br.com.puc.repositories.ProjetoRepository;
import br.com.puc.repositories.PublicacaoRepository;

@Resource
public class PublicacaoController {

	private final Result result;
	private final PublicacaoRepository repository;
	
	private final Validator validator;
	private ProjetoRepository projetoRepository;
	private ColaboradorRepository colaboradorRepository;
	
	public PublicacaoController(Result result, PublicacaoRepository repository, 
	ProjetoRepository projetoRepository, ColaboradorRepository colaboradorRepository,
	Validator validator) {
		this.result = result;
		this.repository = repository;
		this.projetoRepository = projetoRepository;
		this.colaboradorRepository = colaboradorRepository;
		
		this.validator = validator;
	}

	@Publico
	@Get("/publicacoes")
	public List<Publicacao> index() {
		return repository.findAll();
	}
	
	@Post("/publicacoes")
	public void create(Publicacao publicacao, List<Long> autores) {
		addAutoresPublicacao(publicacao, autores);
		if (publicacao.getProjeto() != null && publicacao.getProjeto().getId() == 0)
			publicacao.setProjeto(null);
		validator.validate(publicacao);
		validator.onErrorUsePageOf(this).newPublicacao();
		repository.create(publicacao);
		result.redirectTo(this).index();
	}
	
	@Get("/publicacoes/new")
	public Publicacao newPublicacao() {
		includeLists();
		return new Publicacao();
	}

	private void includeLists() {
		result.include("projetos", projetoRepository.findProjetosEmAndamento());
		result.include("autores", colaboradorRepository.findAll());
	}
	
	private void addAutoresPublicacao(Publicacao publicacao, List<Long> autores) {
		if (autores != null) {
			publicacao.getAutores().clear();
			for (Long idAutor : autores) {
				publicacao.getAutores().add(colaboradorRepository.find(idAutor));
			}
		}
	}

	@Publico
	@Get("/publicacoes/{publicacao.id}")
	public Publicacao show(Publicacao publicacao) {
		return repository.find(publicacao.getId());
	}

	@Delete("/publicacoes/{publicacao.id}")
	public void destroy(Publicacao publicacao) {
		repository.destroy(repository.find(publicacao.getId()));
		result.redirectTo(this).index();  
	}
}